Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Balanced histogram thresholding</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Balanced_histogram_thresholding"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Balanced_histogram_thresholding rootpage-Balanced_histogram_thresholding skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Balanced histogram thresholding</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p>In <a href="Image_processing" class="mw-redirect" title="Image processing">image processing</a>, the <b>balanced histogram thresholding method</b> (BHT),<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> is a very simple method used for automatic image <a href="Thresholding_(image_processing)" title="Thresholding (image processing)">thresholding</a>. Like <a href="Otsu's_Method" class="mw-redirect" title="Otsu's Method">Otsu's Method</a><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> and the <b>Iterative Selection Thresholding Method</b>,<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> this is a <a href="Histogram" title="Histogram">histogram</a> based thresholding method. This approach assumes that the image is divided in two main classes: The <b>background</b> and the <b>foreground</b>. The <b>BHT</b> method tries to find the optimum threshold level that divides the histogram in two classes.
</p>



<p>This method <i>weighs</i> the histogram, checks which of the two sides is heavier, and removes weight from the heavier side until it becomes the lighter. It repeats the same operation until the edges of the <a href="Weighing_scale" title="Weighing scale">weighing scale</a> meet.
</p><p>Given its simplicity, this method is a good choice as a first approach when presenting the subject of <i>automatic image thresholding</i>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Algorithm">Algorithm</h2></div>
<p>The following listing, in <a href="C_(programming_language)" title="C (programming language)">C</a> notation, is a simplified version of the <b>Balanced Histogram Thresholding</b> method:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="kt">int</span><span class="w"> </span><span class="nf">BHThreshold</span><span class="p">(</span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">histogram</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">i_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">)((</span><span class="n">i_s</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i_e</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">2.0f</span><span class="p">);</span><span class="w"> </span><span class="c1">// center of the weighing scale I_m</span>
<span class="w"> </span><span class="n">w_l</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">get_weight</span><span class="p">(</span><span class="n">i_s</span><span class="p">,</span><span class="w"> </span><span class="n">i_m</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">histogram</span><span class="p">);</span><span class="w"> </span><span class="c1">// weight on the left W_l</span>
<span class="w"> </span><span class="n">w_r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">get_weight</span><span class="p">(</span><span class="n">i_m</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">i_e</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">histogram</span><span class="p">);</span><span class="w"> </span><span class="c1">// weight on the right W_r</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i_s</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">i_e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">w_r</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">w_l</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// right side is heavier</span>
<span class="w"> </span><span class="n">w_r</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_e</span><span class="o">--</span><span class="p">];</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(((</span><span class="n">i_s</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i_e</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">i_m</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">w_r</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_m</span><span class="p">];</span>
<span class="w"> </span><span class="n">w_l</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_m</span><span class="o">--</span><span class="p">];</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">w_l</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">w_r</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// left side is heavier</span>
<span class="w"> </span><span class="n">w_l</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_s</span><span class="o">++</span><span class="p">];</span><span class="w"> </span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(((</span><span class="n">i_s</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i_e</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">i_m</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">w_l</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_m</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<span class="w"> </span><span class="n">w_r</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">histogram</span><span class="p">[</span><span class="n">i_m</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">];</span>
<span class="w"> </span><span class="n">i_m</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">i_m</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>The following, is a possible implementation in the <a href="Python_(programming_language)" title="Python (programming language)">Python</a> language:
</p>
<div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span class="k">def</span><span class="w"> </span><span class="nf">balanced_histogram_thresholding</span><span class="p">(</span><span class="n">histogram</span><span class="p">,</span> <span class="n">minimum_bin_count</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="n">jump</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Determines an optimal threshold by balancing the histogram of an image, </span>
<span class="sd"> focusing on significant histogram bins to segment the image into two parts.</span>

<span class="sd"> Args:</span>
<span class="sd"> histogram (list): The histogram of the image as a list of integers, </span>
<span class="sd"> where each element represents the count of pixels </span>
<span class="sd"> at a specific intensity level.</span>
<span class="sd"> minimum_bin_count (int): Minimum count for a bin to be considered in the </span>
<span class="sd"> thresholding process. Bins with counts below this </span>
<span class="sd"> value are ignored, reducing the effect of noise.</span>
<span class="sd"> jump (int): Step size for adjusting the threshold during iteration. Larger values </span>
<span class="sd"> speed up convergence but may skip the optimal threshold.</span>

<span class="sd"> Returns:</span>
<span class="sd"> int: The calculated threshold value. This value represents the intensity level </span>
<span class="sd"> (i.e. the index of the input histogram) that best separates the significant</span>
<span class="sd"> parts of the histogram into two groups, which can be interpreted as foreground</span>
<span class="sd"> and background. </span>
<span class="sd"> If the function returns -1, it indicates that the algorithm was unable to find </span>
<span class="sd"> a suitable threshold within the constraints (e.g., all bins are below the </span>
<span class="sd"> minimum_bin_count).</span>
<span class="sd"> """</span>
<span class="c1"># Find the start and end indices where the histogram bins are significant</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">start_index</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">histogram</span><span class="p">)</span> <span class="ow">and</span> <span class="n">histogram</span><span class="p">[</span><span class="n">start_index</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">minimum_bin_count</span><span class="p">:</span>
<span class="n">start_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">end_index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">histogram</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">while</span> <span class="n">end_index</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">histogram</span><span class="p">[</span><span class="n">end_index</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">minimum_bin_count</span><span class="p">:</span>
<span class="n">end_index</span> <span class="o">-=</span> <span class="mi">1</span>

<span class="c1"># Check if no valid bins are found</span>
<span class="k">if</span> <span class="n">start_index</span> <span class="o">&gt;=</span> <span class="n">end_index</span><span class="p">:</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span> <span class="c1"># Indicates an error or non-applicability</span>

<span class="c1"># Initialize threshold</span>
<span class="n">threshold</span> <span class="o">=</span> <span class="p">(</span><span class="n">start_index</span> <span class="o">+</span> <span class="n">end_index</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>

<span class="c1"># Iteratively adjust the threshold</span>
<span class="k">while</span> <span class="n">start_index</span> <span class="o">&lt;=</span> <span class="n">end_index</span><span class="p">:</span>
<span class="c1"># Calculate weights on both sides of the threshold</span>
<span class="n">weight_left</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">histogram</span><span class="p">[</span><span class="n">start_index</span><span class="p">:</span><span class="n">threshold</span><span class="p">])</span>
<span class="n">weight_right</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">histogram</span><span class="p">[</span><span class="n">threshold</span><span class="p">:</span><span class="n">end_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>

<span class="c1"># Adjust the threshold based on the weights</span>
<span class="k">if</span> <span class="n">weight_left</span> <span class="o">&gt;</span> <span class="n">weight_right</span><span class="p">:</span>
<span class="n">start_index</span> <span class="o">+=</span> <span class="n">jump</span>
<span class="k">elif</span> <span class="n">weight_left</span> <span class="o">&lt;</span> <span class="n">weight_right</span><span class="p">:</span>
<span class="n">end_index</span> <span class="o">-=</span> <span class="n">jump</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># Equal weights; move both indices</span>
<span class="n">start_index</span> <span class="o">+=</span> <span class="n">jump</span>
<span class="n">end_index</span> <span class="o">-=</span> <span class="n">jump</span>

<span class="c1"># Calculate the new threshold</span>
<span class="n">threshold</span> <span class="o">=</span> <span class="p">(</span><span class="n">start_index</span> <span class="o">+</span> <span class="n">end_index</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>

<span class="k">return</span> <span class="n">threshold</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text">A. Anjos and H. Shahbazkia. Bi-Level Image Thresholding - A Fast Method. BIOSIGNALS 2008. Vol:2. P:70-76.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">Nobuyuki Otsu (1979). "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber. 9: 62–66.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text">Ridler TW, Calvard S. (1978) Picture thresholding using an iterative selection method, IEEE Trans. System, Man and Cybernetics, SMC-8: 630-632.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://w3.ualg.pt/~aanjos/prototype/BHThresholding_.jar">ImageJ Plugin</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20131017205614/http://w3.ualg.pt/~aanjos/prototype/BHThresholding_.jar">Archived</a> 2013-10-17 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a></li>
<li><a rel="nofollow" class="external text" href="https://www.youtube.com/watch?v=rKWK4O4dZQ8">Otsu <i>vs</i>. BHT</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-02-11" href="https://en.wikipedia.org/wiki/?title=Balanced_histogram_thresholding&amp;oldid=1275203927">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>